package com.mh.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mh.dto.AuctionConfirmDto;
import com.mh.dto.AuctionInfo;
import com.mh.dto.R;
import com.mh.pojo.AuctionProduct;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * (AuctionProduct)表服务接口
 *
 * @author zmh
 * @since 2023-07-27 16:02:39
 */
public interface AuctionProductService extends IService<AuctionProduct> {

    /**
     * 查询出状态为0或1的竞品
     */
    public R<List<AuctionProduct>> getAllByStatus();


    /**
     * 分页查询
     *
     * @param page 查询页数
     * @param size 一页显示条数
     * @return ·
     */
    public R<Page<AuctionProduct>> getAllByPage(int page, int size);


    /**
     * 获取拍卖时间信息
     * @return 返回Map竞品id:竞拍时间
     */
    public R<Map<String, Object>> getAuctionTimeInfo();

    /**
     * 根据id修改竞品的拍卖状态
     * @param auctionProductId 竞品id
     * @param auctionProductStatus 竞品状态
     * @return 执行结果
     */
    public R<String> updateAuctionProductStatus(String auctionProductId, int auctionProductStatus);

    /**
     * 添加触发竞拍的竞品的到期时间到redis中（用于切换竞品判断倒计时相关）
     * @param auctionProductId 竞品ID
     * @param timeStamp 时间戳
     * @return 执行结果
     */
    public R<String> addCountDownToRedis(String auctionProductId, Long timeStamp);

    /**
     * 根据竞品id，从redis中获取竞品的成交时间戳
     * @param auctionProductId 竞品ID
     * @return 成交的时间戳
     */
    public R<Long> getCountDownFromRedisById(String auctionProductId);

    /**
     * 将拍卖过程信息存入redis（用于拍卖计算和保证数据的安全性），并且取出一项拍卖记录
     * @param auctionInfo 拍卖信息对象
     * @return 上一回合的记录
     */
    public R<String> addAuctionInfoToRedis(AuctionInfo auctionInfo);

    /**
     * 从redis中取出数据存入MYSQL
     * 1.修改竞品的状态（status修改为 2，owner_name为竞拍用户名）---auction_platform
     * 2.修改用户的拍卖竞拍数量 ---users
     * 3.添加redis中的拍卖过程到MySQL --- auction_course
     * @return
     */
    public R<String> addAuctionInfoToMySQL(AuctionConfirmDto auctionConfirmDto);

    /**
     * 发布（添加记录）
     * @param auctionProduct 数据
     * @return ·
     */
    public R<String> addAuctionProduct(AuctionProduct auctionProduct);

    /**
     * 根据用户名获取用户持有的竞品
     * @param userName 用户名
     * @return ·
     */
    public R<List<AuctionProduct>> getAllByUserName(String userName);
}

